from user.config import REDIS_HOST, REDIS_PORT
import redis


class RedisDBConfig:
    HOST = REDIS_HOST
    PORT = REDIS_PORT
    DBID = 0


def operator_status(func):
    '''get operatoration status
    '''

    def gen_status(*args, **kwargs):
        error, result = None, None
        try:
            result = func(*args, **kwargs)
        except Exception as e:
            error = str(e)

        return {'result': result, 'error': error}

    return gen_status


class RedisCache(object):
    def __init__(self):
        if not hasattr(RedisCache, 'pool'):
            RedisCache.create_pool()
        self._connection = redis.Redis(connection_pool=RedisCache.pool)

    @staticmethod
    def create_pool():
        RedisCache.pool = redis.ConnectionPool(
            host=RedisDBConfig.HOST,
            port=RedisDBConfig.PORT,
            db=RedisDBConfig.DBID,
            decode_responses=True
        )

    @operator_status
    def set(self, key, value, ex=None):
        '''set data with (key, value)
        '''
        return self._connection.set(key, value, ex=ex)

    @operator_status
    def get(self, key):
        '''get data by key
        '''
        return self._connection.get(key)

    @operator_status
    def delete(self, key):
        '''delete cache by key
        '''
        return self._connection.delete(key)


if __name__ == '__main__':
    print(RedisCache().set('Testkey', "Simple Test"))
    print(RedisCache().get('Testkey'))
    print(RedisCache().delete('Testkey'))
    print(RedisCache().get('Testkey'))
